admin

SQLite外键示例

sql

我不是sql / sqlite的专家。假设我们有两个表:

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
);

CREATE TABLE MyTableB(
  dog TEXT, 
  FOREIGN KEY(dogList) REFERENCES child(id)
);

如何插入?我的createTable操作正确吗?我希望拥有:一个孩子可以养一只以上的狗狗可以养更多的孩子

编辑

如果我想要所有孩子,并为每个孩子列出与该孩子相关的狗的清单,该怎么办?


阅读 237

收藏
2021-05-10

共1个答案

admin

多对多

为了支持一个零个或多个狗的孩子以及一个零个或多个孩子的狗,您的数据库表结构需要支持“ 多对多” 关系。这需要三个表:

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT
);


CREATE TABLE dog (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    dog TEXT
);

CREATE TABLE child_dog {
    child_id INTEGER,
    dog_id INTEGER,
    FOREIGN KEY(child_id) REFERENCES child(id),
    FOREIGN KEY(dog_id) REFERENCES dog(id)
};

如何插入

在三个表中的每个表中的插入必须是单独的SQL语句,但可以在同一事务的上下文中进行。插入child_dog表(称为 映射表
)必须在插入child和dog表之后进行。这是由于两个相关的原因:

  1. 您需要知道孩子和狗的标识符才能插入此表。
  2. 由于外键约束,如果所引用的子项和/或狗在数据库或事务中不存在,则对child_dog表的插入将失败。

以下是一些用于插入的SQL语句示例:

INSERT INTO child VALUES(NULL, 'bobby');
SELECT last_insert_rowid(); -- gives the id of bobby, assume 2 for this example
INSERT INTO dog VALUES(NULL, 'spot');
SELECT last_insert_rowid(); -- gives the id of spot, assume 4 for this example
INSERT INTO child_dog VALUES(2, 4);

在Python中插入

尽管您的问题没有提到python,但此问题上有一个python标记,因此我假设您想知道如何在python中进行此操作。python中的sqlite3模块提供了一个不错的快捷方式,使您不必显式运行’last_insert_rowid()’函数。

# Import the sqlite3 module
import sqlite3
# Create a connection and cursor to your database
conn = sqlite3.connect('example.db')
c = conn.cursor()
# Insert bobby
c.execute("""INSERT INTO child VALUES(NULL, 'bobby')""")
# The python module puts the last row id inserted into a variable on the cursor
bobby_id = c.lastrowid
# Insert spot
c.execute("""INSERT INTO dog VALUES(NULL, 'spot')""")
spot_id = c.lastrowid
# Insert the mapping
c.execute("""INSERT INTO child_dog VALUES(?, ?)""", (bobby_id, spot_id));
# Commit
conn.commit()
conn.close()
2021-05-10